package com.guava;

import com.google.common.base.Preconditions;
import org.apache.log4j.Logger;

/**
 * PreconditionsTester--GuavaTest
 * <p>
 * 1.所以推荐在方法的入口，或运算开始前，先检查数据。
 * 2.尽早发现错误，精确控制出错的位置。
 *
 * @author: Jovi
 * @createTime: 2018-05-07 10:23
 **/
public class PreconditionsTester {
    public static void main(String[] args) {
        // try {
        //     System.out.println(sqrt(-3.0));
        // } catch (Exception e) {
        //     System.out.println(e.getMessage());
        // }

        Logger logger = Logger.getLogger(PreconditionsTester.class);


        try {
            sum(null, 3);
        } catch (NullPointerException e) {
            logger.warn(e.getMessage(),e);
        }
        System.out.println("nihao");

        System.out.println("aa");
        //
        // try {
        //     System.out.println(getValue1(5));
        // } catch (Exception e) {
        //     System.out.println(e.getMessage());
        // }
        //
        // try {
        //     System.out.println(getValue2(5));
        // } catch (Exception e) {
        //     System.out.println(e.getMessage());
        // }
        //
        // try {
        //     System.out.println(getValue3(1,3));
        // } catch (Exception e) {
        //     System.out.println(e.getMessage());
        // }
        //
        // try {
        //     getBoolean();
        // } catch (Exception e) {
        //     System.out.println(e.getMessage());
        // }

    }

    private static double sqrt(double input) {

        /* 确保涉及的一个或多个参数来调用方法表达式的真相。 */
        Preconditions.checkArgument(input > 0.0, "Illegal Argument passed: Negative value %s .", input);
        return Math.sqrt(input);
    }

    private static int sum(Integer a, Integer b) {


        /* 校验对象是否为空，并使用占位符输出错误信息 */
        a = Preconditions.checkNotNull(a, "Illegal Argument passed: First parameter is Null");

        b = Preconditions.checkNotNull(b, "Illegal Argument passed: Second parameter is Null");

        return a + b;
    }

    private static int getValue1(int input) {
        int[] data = {1, 2, 3, 4, 5};

        /* 校验元素索引是否有效 ，使用checkElementIndex校验，在临界值也就是长度相等的时候报错 */
        Preconditions.checkElementIndex(input, data.length, "Illegal Argument passed : Invalid index.");
        return 0;
    }

    private static int getValue2(int input) {
        int[] data = {1, 2, 3, 4, 5};

        /* 校验元素索引是否有效 ，使用checkPositionIndex校验，在临界值也就是长度相等的时候不报错 */
        Preconditions.checkPositionIndex(input, data.length, "Illegal Argument passed : Invalid index.");
        return 0;
    }

    private static int getValue3(int input1, int input2) {
        int[] data = {10, 20, 30, 40, 50};

        /* 校验是否是有效的索引区间 */
        Preconditions.checkPositionIndexes(input1, input2, data.length);
        return 0;
    }

    private static void getBoolean() {
        /* 校验表达式是否正确，并使用占位符输出错误信息，使用方法作为表达式,一般用作校验方法返回是否为真 */
        Preconditions.checkState(testMethod(), "%s is wrong", "TestMethod()");
    }

    private static boolean testMethod() {
        return 1 > 2;
    }

}
